package com.gitee.wsl.ext.array

import kotlin.math.ceil
import kotlin.math.floor


val DoubleArray.median: Double
    get() {
        if (isEmpty()) return 0.0

        if (size == 1) return first()

        sort()

        if (size % 2 == 0) {
            return arrayOf(
                this[floor((size / 2).toDouble() - 1).toInt()],
                this[ceil((size / 2).toDouble()).toInt()]
            ).average()
        }

        return this[floor((size / 2).toDouble()).toInt()]
    }

val FloatArray.median: Double
    get() {
        if (isEmpty()) return 0.0

        if (size == 1) return first().toDouble()

        sort()

        if (size % 2 == 0) {
            return arrayOf(
                this[floor((size / 2).toDouble() - 1).toInt()],
                this[ceil((size / 2).toDouble()).toInt()]
            ).average()
        }

        return this[floor((size / 2).toDouble()).toInt()].toDouble()
    }

val IntArray.median: Double
    get() {
        if (isEmpty()) return 0.0

        if (size == 1) return first().toDouble()

        sort()

        if (size % 2 == 0) {
            return arrayOf(
                this[floor((size / 2).toDouble() - 1).toInt()],
                this[ceil((size / 2).toDouble()).toInt()]
            ).average()
        }

        return this[floor((size / 2).toDouble()).toInt()].toDouble()
    }